PICMUS challenge: simulation, resolution-distortion test

This example reads (or downloads if it cannot find the data locally) a dataset used in the PICMUS challenge and beamforms it with USTB's general beamformer. A 75 plane-wave sequence was simulated with Field II to estimate the beamforming method resolution and geometric distortion.

_by Alfonso Rodriguez-Molares alfonso.r.molares@ntnu.no and Olivier Bernard olivier.bernard@insa-lyon.fr

$Last updated: 2017/09/15$

Contents

Checking if the file is in the local path, and downloading otherwise

We define the local path and the url where the data is stored

% data location
url='http://ustb.no/datasets/';      % if not found data will be downloaded from here
filename='PICMUS_simulation_resolution_distortion.uff';

% checks if the data is in your data path, and downloads it otherwise.
% The defaults data path is under USTB's folder, but you can change this
% by setting an environment variable with setenv(DATA_PATH,'the_path_you_want_to_use');
tools.download(filename, url, data_path);

What's inside?

This dataset should contain the following structures: * channel_data, * beamformed_data and, * scan

We can check it out with the index function

display=true;
content = uff.index([data_path filesep filename],'/',display);
UFF: Contents of \\kant\ifi-ansatt-u08\omrindal\Repos\USTB_summer_student_2021\data\PICMUS_simulation_resolution_distortion.uff at /
   - /beamformed_data: beamformed_data [uff.beamformed_data] size(1,1)
   - /channel_data: channel_data [uff.channel_data] size(1,1)
   - /scan: scan [uff.linear_scan] size(1,1)

Plotting beamformed_data

We can read the beamformed_data object and plot it

b_data=uff.read_object([data_path filesep filename],'/beamformed_data');
b_data.plot();
UFF: reading beamformed_data [uff.beamformed_data]
UFF: reading sequence [uff.wave] [====================] 100%

Loading channel data & scan

The file also contain channel_data and scan. We read it so we can replicate the beamformed image in the UFF file.

channel_data=uff.read_object([data_path filesep filename],'/channel_data');
scan=uff.read_object([data_path filesep filename],'/scan');
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%

Beamforming

We define a beamformer, and the corresponding transmit and apodization windows, and launch it.

pipe=pipeline();
pipe.channel_data=channel_data;
pipe.scan=scan;

% receive apodization
pipe.receive_apodization.window=uff.window.tukey50;
pipe.receive_apodization.f_number=1.7;

% transmit apodization
pipe.transmit_apodization.window=uff.window.tukey50;
pipe.transmit_apodization.f_number=1.7;

% launch beamforming
b_data_new=pipe.go({midprocess.das postprocess.coherent_compounding});
USTB General beamformer MEX v1.1.2 .............done!

Comparing results

We plot both images side by side.

figure;
b_data.plot(subplot(1,2,1),'Original');
b_data_new.plot(subplot(1,2,2),'New');
set(gcf,'Position',[100   100   750   450])
Error using set
Cannot find 'set' method for postprocess.generalized_coherence_factor class.

Error in simulation_resolution_distortion (line 81)
set(gcf,'Position',[100   100   750   450])